import com.tedu.springdemo.day04.*;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test07 {
    /**
     * 注解：可以替代bean.xml配置文件
     *      语法：@Test 表示方法下是一个junit单元测试操作
     * SpringIOC 提供注解
     * @Component注解：实现bean注入，替代bean标签编写
     * 使用注解：1.配置包扫描器  哪个类使用注解
     *         2.直接使用注解
     */
    @Test
    public void test01(){
        ApplicationContext ac=new ClassPathXmlApplicationContext("beans11.xml");
        Student s=(Student) ac.getBean("student");
        System.out.println(s);
        Teacher t=(Teacher) ac.getBean("t");
        System.out.println(t);
        ((ClassPathXmlApplicationContext)ac).close();
    }
    /**
     * @Component 不指定id名称  采用自动推断 id 规则
     * Person 推断 person
     * PErson 推断 ？     PErson
     * pErson 推断 ？     pErson
     *
     * 总结：主要看单词第二个字母
     *      第二个字母小写，第一个字母小写
     *      第二个字母大写，第一个字母不变
     */
    @Test
    public void test02(){
        ApplicationContext ac=new ClassPathXmlApplicationContext("beans11.xml");
        PErson1 pErson1=(PErson1) ac.getBean("PErson1");
        System.out.println(pErson1);
        pErson2 p2=(pErson2) ac.getBean("pErson2");
        System.out.println(p2);
        ((ClassPathXmlApplicationContext)ac).close();
    }

    /**
     * Spring 支持工厂方法：实例工厂
     * <bean id="NCI" class="包.NetConnInstanceFactory"></bean>
     * <bean id="nci" class="包.NetConnection" factory-bean="NCI"></bean>
     *
     * @Bean注解：用于方法上,返回一个对象
     * 复制：NetConnection 对象
     *      NetConnInstanceFactory  对象
     */
    @Test
    public void test03() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans11.xml");
        //调用实例化工厂---对象
        NetConnection nc=(NetConnection) ac.getBean("nc");
        nc.sendData();
        ((ClassPathXmlApplicationContext)ac).close();
    }

    /**
     * @Value 注解  针对属性 注入值
     * 属性 统一写在外面 demo.properties   属性值不建议直接写在@Value（“不方便修改”）
     *    统一属性值写在外部文件
     *    1.demo.properties文件 添加属性值 【修改文件--配置文件】
     *    2.读取demo.properties文件，需要在beans.xml
     *    <context:property-placeholder location="demo.properties"></context:property-placeholder>
     *    3.@Value 注解  关联 外置文件 k值
     * 语法糖：配置List、set、Map Properties "#{@定义xml文件中id名}"
     */
    @Test
    public void test04(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans11.xml");
        Demo d=(Demo) ac.getBean("demo");
        System.out.println(d);
        ((ClassPathXmlApplicationContext)ac).close();
    }

    /**
     * @PostConstruct 注解：方法初始化【优先执行】
     * @PreDestroy  注解：方法销毁【最后执行】
     * @Scope("prototype")       注解：指定单例模式还是多例模式，用类上
     * @Lazy    注解：如果单例模式，添加它，这个类需要懒加载【延迟创建对象】
     *
     *
     * @Component  ---通用  获取bean方式<bean id=".."class="...">  不建议使用
     * JavaWeb  按照MVC设计思想   Servlet
     * @Controller-----WEB层  V view  视图层  html+css+js /jsp
     * @Service--------Service层  C 转发某个页面【逻辑处理】
     * @Repository-----DA0 M 模型层  数据库连接 数据库连接类
     *  针对于不同类，添加对应的视图层，控制层，模型层 获取bean方式
     *
     */

    @Test
    public void test05(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("beans11.xml");
        UserDao ud=(UserDao) ac.getBean("userDao");
        ud.addUser();
        ud.updateUser();
        ((ClassPathXmlApplicationContext)ac).close();
    }
}
